#ifndef UTILS_H
#define UTILS_H

#include <chrono>
#include <string>
#include <iostream>
#include <sstream>
#include <memory>
#include <vector>

// 计时器类，用于测量代码的执行时间
class Timer {
private:
    std::chrono::high_resolution_clock::time_point start_time;
    std::chrono::high_resolution_clock::time_point end_time;
    bool running;
    std::string name;

public:
    // 创建一个计时器，可以指定一个名称
    Timer(const std::string& name = "");
    
    // 开始计时
    void start();
    
    // 结束计时
    void stop();
    
    // 重置计时器
    void reset();
    
    // 获取经过的时间（毫秒）
    double elapsedMilliseconds() const;
    
    // 获取经过的时间（秒）
    double elapsedSeconds() const;
    
    // 打印经过的时间
    void printElapsed(std::ostream& os = std::cout) const;
    
    // 获取计时器名称
    const std::string& getName() const;
};

// 解析命令行参数
class ArgParser {
private:
    int argc;
    char** argv;
    
public:
    ArgParser(int argc, char** argv);
    
    // 获取整数参数，如果不存在或格式错误则返回默认值
    int getInt(const std::string& option, int defaultValue = 0) const;
    
    // 获取浮点数参数
    float getFloat(const std::string& option, float defaultValue = 0.0f) const;
    
    // 获取字符串参数
    std::string getString(const std::string& option, const std::string& defaultValue = "") const;
    
    // 检查是否存在某个选项
    bool hasOption(const std::string& option) const;
    
    // 打印帮助信息
    void printHelp(std::ostream& os = std::cout) const;
};

// 内存相关工具函数
namespace MemoryUtils {
    // 打印当前内存使用情况
    void printMemoryUsage(std::ostream& os = std::cout);
    
    // 获取系统可用内存大小（字节）
    size_t getAvailableMemory();
    
    // 获取当前进程使用的内存大小（字节）
    size_t getCurrentMemoryUsage();
}

// 报告相关工具函数
namespace ReportUtils {
    // 打印性能报告头部
    void printReportHeader(std::ostream& os = std::cout);
    
    // 打印性能报告行
    void printReportLine(const std::string& implementation, int M, int N, int K, 
                         double timeMs, double gflops, std::ostream& os = std::cout);
                         
    // 计算GFLOPS（每秒十亿次浮点运算）
    double calculateGflops(int M, int N, int K, double timeSeconds);
}

#endif // UTILS_H 